Bei der Entwicklung von Softwareprojekten werden eine Vielzahl unterschiedlicher Techniken und Programmiersprachen eingesetzt, um geforderte bzw. gewĂ¼nschte Funktionen zu realisieren. Verschiedene Faktoren, wie GrĂ¶ĂŸe, Budget usw. eines Softwareteams können zu einer unterschiedlichen Aufgabenverteilung innerhalb des Teams fĂ¼hren.
In diesem Notebook soll deshalb die Beziehung zwischen Entwicklern, Commits und Programmiersprachen anhand der Git-Historie von Softwareprojekten, speziell Datenbanken, untersucht werden. Hierbei soll im ersten Abschnitt insbesondere die Frage beantwortet werden, ob Entwickler auf eine Programmiersprache spezialisiert sind, oder vielmehr Aufgaben nach Bedarf erfĂ¼llen. Im zweiten Abschnitt werden zusätzlich zur Programmiersprache auch die Dateien und die Projektstruktur einbezogen. Dabei sollen die folgenden Fragen beantwortet werden:
Zu Beginn betrachten wir das Farbschema fĂ¼r die nachfolgenden Diagramme. Das Schema wurde zur besseren Verständlichkeit der Diagramme einheitlich gewählt:
Innerhalb dieses Notebooks werden speziell drei Datenbankengines im Detail betrachtet: MySQL, MongoDB und PostgreSQL. Zur besseren Verständlichkeit werden Graphen immer mit den zu den Datenbankengines zugehörigen Farben gezeichnet. Die Zuteilung ist im folgenden Diagramm zu sehen:
Die Git-Historien der einzelnen Datenbanken liegen als .csv Dateien vor. Diese werden geladen und anschlieĂŸend automatisch zur weiteren Benutzung vorbereitet. Dazu gehört unter anderem die Bereinigung sowie das Vorbereiten neuer Spalten. Um den Leser einen Ăœberblick Ă¼ber das Schema der Daten zu vermitteln, werden einige zufällige Einträge des erzeugten Dataframe gezeigt:
Es sind unter anderem wichtige Informationen zur Datenbank, dem entsprechenden Commit, dem Author und den gemachten Änderungen verhanden.
Die Git-Historien der folgenden Datenbanken wurden erfolgreich geladen:
## [1] "Cassandra" "Couchbase" "CouchDB" "Elasticsearch"
## [5] "etcd" "Firebird" "Greenplum" "Hazelcast"
## [9] "HBase" "Hive" "Impala" "InfluxDB"
## [13] "MariaDB" "Memcached" "MongoDB" "MySQL"
## [17] "Neo4j" "PostgreSQL" "Presto" "Realm"
## [21] "Redis" "Solr" "Spark SQL" "Sphinx"
## [25] "SQLite"
Es lässt sich schnell feststellen, dass die Meta-Informationen zu den Datenbanken stark varrieren.
Bei der Betrachtung des Ăœberblicks als Bubblechart liegen die meisten Datenbanken in der unteren, linken Ecke. Einige AusreiĂŸer sind zum Beispiel: MySQL, MariaDB und SparkSQL.
FĂ¼r die Entwickler und Programmiersprachen wird jeweils eine Rangliste erstellt und die x Entwickler/Programmiersprachen mit den meisten Ă„nderungen.
Damit Fragestellungen zum Verhältnis zwischen Entwicklern und Programmiersprachen beantwortet werden können, muss zuerst ein Ăœberblick Ă¼ber die in den verschiedenen Datenbankengines eingesetzten Programmiersprachen erstellt werden. Diese Fragestellung kann jedoch nicht mit den Rohdaten der Git-Historien beantwortet werden. Es sind lediglich die Dateipfade fĂ¼r jede Datei vorhanden. Aus den Pfaden können die Dateiendungen extrahiert werden und anhand dieser kann eine Programmiersprache zugewiesen werden. In den meisten Fällen funktioniert dieses Verfahren hervorragend. Problematisch sind Dateiendungen, welche von mehreren Programmiersprachen genutzt werden. Ein häufig auftretendes Beispiel sind die Programmiersprachen C und C++. Beide verwenden beispielsweise .h Dateiendungen. In diesem Fall ist eine eindeutige Zuweisung nicht möglich und es eine der Möglichkeiten zufällig ausgewählt werden. Da in einer C++-Datei auch C-Code stehen kann, mĂ¼sste eine Analyse der einzelnen Dateien stattfinden, um ein sicheres Ergebnis zu erhalten. FĂ¼r dieses Notebook und die betrachteten Fragestellungen reicht jedoch eine reines Zuweisung von Endung zu Programmiersprache aus.
Das folgende Diagramm zeigt den Anteil der eingesetzten Programmiersprachen je Projekt. Der Anteil wurde als prozentualer Anteil der veränderten Lines of Code im Verhältnis zur Gesamtanzahl der veränderten LOC (Lines of Code) berechnet. Es werden ingesamt 25 Datenbankengines betrachtet.
Es gilt zu beachten, dass nur die 8 am meisten verwendeten Sprachen (bestimmt anhand LOC) angezeigt werden. Die restlichen Programmiersprachen wurden unter ‘’other_pl’’ zusammengefasst.
Das oben gezeigte Diagramm lässt klar erkennen, dass fast jede Datenbank eine primär genutzte Programmiersprache besitzt. Oft beträgt der Anteil der am meisten genutzten Sprache Ă¼ber 75%. Stark verteten sind unter anderem C(Bsp: PostgreSQL, SQLite usw.) oder Java(Elasticsearch, Cassandra, Solr usw.). Weitere nennenswerte Primärsprachen sind Go(etcd, InfluxDB) und Scala(SparkSQL). In einigen Fällen bestehen Datenbanken aus einer Kombination von Sprachen. Couchbase sowie CouchDB sind beide zu groĂŸen Teilen in Erlang und Javascript geschrieben. Häufig ist auch die Kombination aus C++ und C vertreten. Wie oben beschrieben lässt sich nicht eindeutig feststellen, ob eine Datei nun in C, C++ oder als eine Mischung geschrieben ist. Trotzdem lässt sich eindeutig sagen, dass C und C++ einen groĂŸen Anteil an vielen der betrachteten Datenbanken ausmachen. Somit sind Java, C und C++ die am häufigsten vertretenen Programmiersprachen in den geladenenen Datenbanken.
Verschiedene Programmiersprachen wie Python, GCC Machine Description oder Shell bilden immer nur kleine Anteile einer Datenbankengine. Diese können bspw. fĂ¼r Schnittstellen der Datenbanken zu anderen Programmiersprachen oder als Hilfswerkzeuge genutzt worden sein.
Die Menge an verschiedenen Datenbanken ist zu hoch, um fĂ¼r jede eine detallierte Betrachtung anzufertigen. Aus diesem Grund werden stichprobenartig 3 Datenbanken ausgewählt, die detalliert betrachtet bzw. verglichen werden sollen. Bei interessanten Werten werden auch andere Datenbanken geplottet. Es wurden die folgenden Datenbanken ausgewählt:
## [1] "PostgreSQL" "MySQL" "MongoDB"
Noch einmal der Ăœberblick Ă¼ber die Programmiersprachen je Datenbankengine fĂ¼r die drei gewählten Engines:
Alle 3 sind Ă¼berwiegend C bzw. C++ basiert. Dadurch lassen die Datenbanken sich besser vergleichen. Bei der hohen Anzahl an gemachten Ă„nderungen, ist es beachtlich, dass einige Entwickler fast 25% der gesamten Entwicklung beigetragen haben.
In den drei folgenden Diagrammen werden die einzelnen Anteile von den am meisten beitragenden Entwicklern pro Datenbank gezeigt.
Im folgenden Diagramm werden die Anteile der eingesetzten Programmiersprachen pro Entwickler betrachtet. Dabei werden die zwölf Entwickler mit den meisten Commits betrachtet.
MongoDB hat hauptsächlich C/C++ Entwickler mit den meisten Beiträgen. In Anbetracht der Anteile von C/C++ an MongoDB ist dies jedoch zu erwarten. Interessant ist jedoch, dass die restlichen Autoren wesentlich mehr in JavaScript beigetragen haben. ### Entwickler pro Programmiersprache fĂ¼r MongoDB
Hier wird nochmal deutlich, dass die Top-Entwickler den grĂ¶ĂŸten Anteil C/C++ stemmen, jedoch wenig Anteil an anderen Sprachen haben.
PostgreSQL ist stark C lastig. Auch hier sind die Top-Entwickler stark mit C belegt.
Auffällig ist hier die fast deckungsgleiche Fläche zwischen C und den restlichen Programmiersprachenanteilen.
Die meisten Entwickler in MySQL sind C/C++ lastig. Auffällig sind hier jedoch zum einen ein Assembly Entwickler, zum anderen zwei Entwickler fĂ¼r Jasmin/JavaScript.
### Detail-Ansicht interessante Autoren in MySQL
## Entwicklung Anteil Programmiersprache Ă¼ber Zeit
Im Folgenden ist ein Ausschnitt der Programmiersprachen-Verteilung Ă¼ber 50 zufällige Commits je Commit dargestellt. Hierbei wird der Anteil der Ă„nderungen in Lines of Code pro Commit in der zugehöriger Programmiersprache als Balkendiagramm gezeichnet.
Auffällig: GrĂ¶ĂŸtenteils 1 Sprache pro Commit.
Betrachtung der Dichte von Programmiersprache je Commit:
Ăœber alle Datenbanken hinweg:
## Hässliches Entlein:
## name count_file
## 1 Elasticsearch 54590
## 2 Neo4j 50189
## 3 MongoDB 31544
## 4 MySQL 30870
## 5 Solr 25944
## 6 Hazelcast 20572
## 7 MariaDB 20326
## 8 Greenplum 20057
## 9 Hive 17591
## 10 Spark SQL 11733
## 11 Presto 11107
## 12 HBase 10683
## 13 InfluxDB 8447
## 14 PostgreSQL 5108
## 15 Cassandra 5107
## 16 Firebird 5069
## 17 Impala 3985
## 18 CouchDB 2748
## 19 etcd 2401
## 20 Couchbase 2307
## 21 Realm 1829
## 22 Redis 943
## 23 SQLite 650
## 24 Sphinx 265
## 25 Memcached 175
## Weitere Ideen: